#include <iostream>
#include <string>
#include <json/json.h>

// 定义一个名为 parseJsonString 的函数，它接受一个常量引用的 std::string 类型参数 jsonStr
// 该函数的作用是解析传入的 JSON 字符串，并在解析成功的 JSON 对象中添加一个名为 "_idsa" 的键值对
Json::Value parseJsonString(const std::string& jsonStr) {
    // 声明一个 Json::Value 类型的变量 root，用于存储解析后的 JSON 数据
    Json::Value root;
    // 创建一个 Json::Reader 对象 reader，该对象用于解析 JSON 字符串
    Json::Reader reader;
    // 调用 reader 的 parse 方法，尝试将传入的 jsonStr 解析为 JSON 数据并存储到 root 中
    // parse 方法返回一个布尔值，表示解析是否成功
    bool parsingSuccessful = reader.parse(jsonStr, root);

    // 检查解析是否失败
    if (!parsingSuccessful) {
        // 如果解析失败，使用 std::cerr 输出错误信息
        // reader.getFormattedErrorMessages() 方法会返回格式化后的错误信息
        std::cerr << "Failed to parse JSON string: " << reader.getFormattedErrorMessages() << std::endl;
    }
    // 无论解析是否成功，都在 root 中添加一个名为 "_idsa" 的键值对，其值为字符串 "12345"
    root["_idsa"] = "12345";
    // 返回解析后的 JSON 对象 root
    return root;
}

int main() {
    // 示例 JSON 字符串
    std::string jsonString = R"({"name": "Alice", "age": 25, "scores": [90, 85, 88]})";

    // 调用函数解析 JSON 字符串
    Json::Value jsonData = parseJsonString(jsonString);

    if (!jsonData.isNull()) {
        // 进行键值操作
        std::string name = jsonData["name"].asString();
        int age = jsonData["age"].asInt();
        Json::Value scores = jsonData["scores"];
        std::string idstr = jsonData["_idsa"].asString();
        std::cout << "_idsa: " << idstr << std::endl;
        std::cout << "Name: " << name << std::endl;
        std::cout << "Age: " << age << std::endl;
        std::cout << "scores: " << scores << std::endl;
    }

    return 0;
}